import pickle


__all__ = [
    'read_file',  # 读取文件
    'write_file',  # 写入文件

    'pack',  # 写入pkl文件（二进制）
    'unpack',  # 读取pkl文件（二进制）
]


ENCODING_UTT_8 = 'utf-8'
ENCODING_UTT_16 = 'utf-16'
ENCODING_UTT_32 = 'utf-32'

"""
ASCII编码每个字母或符号占1byte（8bits），
    并且8bits的最高位是0，因此ASCII能编码的字母和符号只有128个。
    有一些编码把8bits最高位为1的后128个值也编码上，使得1byte可以表示256个值，
    但是这属于扩展的ASCII，并非标准ASCII。通常所说的标准ASCII只有前128个值！
"""
ENCODING_ASCII = 'ascii'

""" GB2312 
    在GB2312中收录了6763个汉字以及682个特殊符号，已经囊括了生活中最常用的所有汉字
"""
ENCODING_GB2312 = 'gb2312'

""" GBK编码,
    可以表示的汉字达到了20902个，另有984个汉语标点符号、部首等。
    值得注意的是这20902个汉字还包含了繁体字，但是该繁体字与台湾Big5编码不兼容，
    因为同一个繁体字很可能在GBK和Big5中数字编码是不一样的。
"""
ENCODING_GBK = 'gbk'

"""GB18030
    因此GB18030多出来的汉字使用4bytes编码。
    当然，为了兼容GBK，这个四字节的前两位显然不能与GBK冲突（实操中发现后两位也并没有和GBK冲突）
"""
ENCODING_GB18030 = 'gb18030'


""" 文件读写模式
r  : 只进行读的操作，需要文件存在，进行读操作时，文件的光标在开头的第一个字节。
r+ : 即可读也可以写，需要文件存在。

w  : 只对文件进行全覆盖写入，若文件不存在，则会新建一个文件，文件光标处于文件开头。
w+ : 可读可写（全覆盖），若文件不存在，则会新建一个文件，文件光标处于文件开头。

a  : 对文件进行追加，若文件不存在会新建文件，文件光标位于文件末尾。
a+ : 可读可写，若文件不存在则会新建文件，文件光标处于文件末尾。

rb : 读取文件二进制
wb : 写入文件二进制
"""


# -------------------- file begin -------------------- #

def read_file(path, mode='r', encoding='utf-8', sep=None):
    """ 读取文件 """
    if mode not in ['r', 'r+', 'rb', 'a+', 'w+']:
        raise Exception(f"请检查文件读取模式:{mode} 模式可选 'r', 'r+', 'rb', 'a+'")
    if mode in ['rb']:
        encoding = None
    with open(path, mode=mode, encoding=encoding) as f:
        data = f.read()
    if sep and isinstance(data, str):
        data = data.split(sep)
    return data


def write_file(obj, path, mode='w', encoding='utf-8'):
    """ 写入文件 """
    if mode not in ['w', 'w+', 'wb', 'a', 'a+', 'r+']:
        raise Exception(f"请检查文件读取模式:{mode} 模式可选 'w', 'w+', 'wb', 'a', 'a+', 'r+' ")
    if mode in ['wb']:
        encoding = None
    with open(path, mode=mode, encoding=encoding) as f:
        f.write(obj)

# -------------------- file end --------------------- #

# -------------------- pkl begin -------------------- #


def pack(obj, path):
    with open(path, 'wb') as f:
        pickle.dump(obj, f)


def unpack(path):
    with open(path, 'rb') as f:
        obj = pickle.load(f)
    return obj

# -------------------- pkl end --------------------- #

